package com.fanghaoran.dao;

import com.fanghaoran.bean.Interaction;
import com.fanghaoran.entity.Users;
import com.fanghaoran.service.UserService;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;

/**
 * @Author: win11
 * @Date: 2023/03/22/13:45
 * @Description: 用户查看/编辑个人信息操作的数据库操作
 */
public class InfoDao {

    /**
     * 通过用户名获取用户信息
     * @param username 用户名
     */
    public Interaction getInfo(String username) throws Exception {
        String sql="select * from user_info where username=?;";
        List<Users> users = BaseDao.executeQuery(Users.class, sql,username);
        Users user = users.get(0);
        //返回结果
        return new Interaction(null,user);
    }

    /**
     * 更新用户信息
     * @param user 用户更新后的信息user类
     * @param oldUsername 旧用户名
     * @param oldTelephone 旧手机号
     */
    public Interaction updateInfo(Users user,String oldUsername,String oldTelephone) throws Exception {
        //从数据库查询新的用户名是否存在
        Users users=(Users)getInfo(user.getUsername()).getMessage();

        //从数据库查询新的手机号是否已存在
        String sql3 = "select * from user_info where telephone=?;";
        List<Users> users1 = new ArrayList<>();
        try {
            users1 = BaseDao.executeQuery(Users.class, sql3,user.getTelephone());
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        //判断用户名是否存在
        //新用户名不等于旧用户名并且从数据库查询新用户名得到的数据不为空,说明用户名存在
        if ((!oldUsername.equals(user.getUsername())) && (users!=null)) {
            return new Interaction("用户名已存在",null);
        }
        //判断手机号是否已被绑定
        else if (!oldTelephone.equals(user.getTelephone()) && (!users1.isEmpty())) {
            return new Interaction("该手机已绑定其他账号",null);
        }else{
            //检验完毕,可以更新数据
            String sql4="update user_info set username=?,telephone=?,nickname=?,gender=?,signature=? where username=?;";
            try {
                BaseDao.executeUpdate(sql4, user.getUsername(), user.getTelephone(),
                        user.getNickname(),user.getGender(),user.getSignature(),oldUsername);
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            //返回结果
            return new Interaction("信息编辑成功!",null);
        }
    }

    /**
     * 修改密码
     * @param user 用户数据
     * @param oriPasswordInput 旧密码
     * @param modifiedPasswordInput 修改后的密码
     */
    public Interaction modifyPassword(Users user,String oriPasswordInput,String modifiedPasswordInput) throws SQLException {
        //拿到数据库中该用户存储的盐
        String saltBase64 = user.getSalt();
        //对盐解码
        byte[] salt = Base64.getDecoder().decode(saltBase64);
        //拿到用户输入的密码,将它与数据库中该用户存储的盐进行哈希加密运算,得到的结果和数据库中存储的加盐后的密码一致,说明密码正确
        byte[] hashPassword = UserService.hashPassword(oriPasswordInput,salt);
        //对用户的输入加密后进行编码
        String hashPasswordString = Base64.getEncoder().encodeToString(hashPassword);
        if(user.getPassword().equals(hashPasswordString)){
            //密码校验正确,可以修改
            //对新密码进行
            byte[] modifiedPassword = UserService.hashPassword(modifiedPasswordInput, salt);
            //对用户的输入加密后进行编码
            String modifiedPasswordString = Base64.getEncoder().encodeToString(modifiedPassword);
            String sql="update user_info set password=? where username=?;";
            BaseDao.executeUpdate(sql,modifiedPasswordString,user.getUsername());
            return new Interaction("密码修改成功",null);
        }else{
            return new Interaction("原密码错误",null);
        }
    }
}
